import 'reflect-metadata';
// import collectionInstance from '../collection';

type MyPropDecorator = (targetClassPrototype: any,propertyKey: string | symbol) => void;

/**
 *autowire依赖注入的意思
 * @param dependencyid 唯一标识传参，
 * @param singleton 是否是单件设计模式，单例设计模式
 * @returns
 */
export default function Autowired(dependencyid?: string, singleton?: boolean): MyPropDecorator {
  return (targetClassPrototype, propertyKey) => {
    // 修饰的是 ../service/UserSerice.ts
    // targetClassPrototype 就是 UserController 中的 原型对象属性集合
    // propertyKey 就是  private userServiceImpl!: UserServiceInter;中的userServiceImpl 修饰的定义的属性变量

    // 得到的的 PropServiceClass 就是   private userServiceImpl!: UserServiceInter; 中的 UserServiceInter
    let PropServiceClass: any = Reflect.getMetadata('design:type', targetClassPrototype,  propertyKey);
    let ServiceImplClass: any = PropServiceClass.getServiceImplClass();
    let ServiceImplInstance;
    if (singleton) {
      ServiceImplInstance = ServiceImplClass.getInstance();
    } else {
      ServiceImplInstance = new ServiceImplClass();
    }

    // collectionInstance.set(propertyKey, PropClassObj); //有可能被用于不同的控制器，造成key相同value而覆盖
    // 由于 targetClassPrototype 原型+ propertyKey 一起是绝对不会被覆盖的，充分保证了数据属性中的 value 的对象的 唯一性:
    // 如订单、用户、登录 控制器，都需要用到UserSerice 类
    Reflect.defineProperty(targetClassPrototype, propertyKey, {
      value: ServiceImplInstance,
    });
  };
}
